Dynamic Programming 是一種在計算機科學和數學中常用的問題解決方法。
它的主要策略是將一個複雜的問題拆解成較小的子問題,然後將這些子問題的解保存起來,以避免重複計算,從而提高效率。動態規劃通常適用於具有重疊子問題結構和最優子結構性質的問題。
動態規劃的步驟包括:
動態規劃可以應用於各種不同的問題,包括最優化、排程、路徑搜索和序列比對等。
首先來個簡單的
Fibonacci Sequence 是一個數學數列,其中每一個數字都是前兩個數字的和。
它通常以F(n)表示,其中n是數列的索引,從0開始。
這個數列的前幾個數字是0、1、1、2、3、5、8、13、21,以此類推。
費波那契數列的數學定義如下:
// Fibonacci Sequence
class Fibonacci {
fun fib(n: Int): Int {
if (n <= 1) return n
return fib(n - 1) + fib(n - 2)
}
}
// main function
fun main(args: Array<String>) {
val fib = Fibonacci()
println("Fibonacci(5) = ${fib.fib(5)}")
println("Fibonacci(10) = ${fib.fib(10)}")
println("Fibonacci(20) = ${fib.fib(20)}")
}
Longest Common Subsequence (LCS) 用來表示兩個序列中最長的共同子序列。
演算法
// Longest Common Subsequence in Kotlin
class LCS {
fun lcs(X: String, Y: String, m: Int, n: Int): Int {
val L = Array(m + 1) { IntArray(n + 1) }
for (i in 0..m) {
for (j in 0..n) {
if (i == 0 || j == 0) {
L[i][j] = 0
} else if (X[i - 1] == Y[j - 1]) {
L[i][j] = L[i - 1][j - 1] + 1
} else {
L[i][j] = Math.max(L[i - 1][j], L[i][j - 1])
}
}
}
return L[m][n]
}
}
// main function
fun main(args: Array<String>) {
val X = "AGGTAB"
val Y = "GXTXAYB"
val m = X.length
val n = Y.length
val lcs = LCS()
println("Length of LCS is ${lcs.lcs(X, Y, m, n)}")
}
透過上述結果,我們可以找到 Longest Common Subsequence (LCS) 結果是 GTAB
所有 Code 可以在 Github 找到 ~
接下來明天要講解